{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Plot convergence and runtime details\n",
    "Based on saved standard deviations and means from \"/notebooks/simulation/Generate and Save Deviations.ipynb\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAsgAAADQCAYAAAAasZepAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJzsnXl4VOXZ/z/3bNkXCJvsiLIKBoiyI+6oFaVqkZbWilrXSt3fLla0aK36Wq2vVflVBa1GrFZbF1BBlAAubBEEFATDLksC2Ugy2/3748xMZjKTZAgJCeT5XNdcM+c5z3PmziQ58z33uRdRVQwGg8FgMBgMBoOFrbkNMBgMBoPBYDAYWhJGIBsMBoPBYDAYDGEYgWwwGAwGg8FgMIRhBLLBYDAYDAaDwRCGEcgGg8FgMBgMBkMYRiAbDAaDwWAwGAxhGIFsMBgMBoPBYDCEYQSywWAwGAwGg8EQhhHIBoPBcBwiIh1F5HkRmRfYHiAi1zS3XQaDwXAsIK2pk167du20Z8+ezW2GwWAwxMXKlSv3q2r7hqwNCOMXgd+r6qki4gBWq+qgxrTRnFcNBsOxRLznVcfRMKal0LNnT1asWNHcZhgMBkNciMjWI1jeTlVfF5HfAqiqV0R8jWRaCHNeNRgMxxLxnldNiIXBYDAcn5SLSBagACIyAihuXpMMBoPh2KBVeZANBoOhFXE78F+gt4gsBdoDlzevSQaDwXBsYASywWAwHIeo6ioROQPoCwjwrap6mtksg8FgOCZo9QLZ4/GwY8cOKisrm9sUg+GISExMpGvXrjidzuY2xdCMiMiPa9nVR0RQ1X8fVYMMhuMcoyNaJkf6ndjqBfKOHTtIS0ujZ8+eiEhzm2MwNAhVpbCwkB07dtCrV6/mNsfQvFwceO4AjAI+DmyfCSwDjEA2GBoRoyNaHo3xndjqk/QqKyvJysoyf9SGYxoRISsry3gwWhjq9eLfW4j6/EfvPVWvVtWrAScwQFUvU9XLgIGBMYPB0IgYHdHyaIzvxFbvQQbMH7XhuMD8Hbcc1OvFX1iMFpeCKvasNs1hRjdV3R22vQfo3hyGGAzHO+b82/I40t+JEcgGg8HQSNQUxgBaWUXVu4tIuPhMxHZUb9otFJEPgNzA9mRgwdE0wGAwGI5VWn2IRUtARJg6dWpo2+v10r59e370ox8d1nF69uzJ/v37GzwnPz8fEWH+/PmH9b5HwsGDB/n73/8e2t61axeXXx5/Japf/vKXvPHGG01h2mHZ0KtXL7Kzs+nXrx/3339/k7/njBkzeOyxx5r8fQzxoR4vvj378W3ejh4sAVX8B0uofONDSu96jEOPvYjns6+Ork2qtwDPAacGHrNU9ddH1QiDwXBUePDBBxk4cCCDBw8mOzubL774oknfb/z48YfVIOjzzz9n+PDhZGdn079/f2bMmAHA7NmzueWWW+o8dm3axG63k52dzSmnnMIVV1zBoUOHGv4DxcAI5BZASkoKX3/9NRUVFQB89NFHdOnS5ajbkZuby5gxY8jNza1/ciNRUyB37ty52QVvffh80c3IHn30UfLz88nPz2fOnDl8//33zWCZ4WgTEsZbtqMHSwHw7dxDxQv/puyex3HPz4MKKwauMve9o2+f6r9V9bbA462jboDBYGhyPvvsM959911WrVrFmjVrWLBgAd26dWtusyK46qqrmDVrFvn5+Xz99df85Cc/iXttbdokKSkpdDyXy8Wzzz7bqDY3eoiFiNiwvBWdgQrga1XdG8e6F4AfAXtV9ZTA2KNYGdluYDNwtaoeFJGewAbg28Dyz1X1hiO1vWjs1PonNZC2ef+sc/+FF17Ie++9x+WXX05ubi5TpkwhLy/PsquoiGnTprFlyxaSk5OZNWsWgwcPprCwkClTprBz505GjhyJBm7pAvzzn//kb3/7G263m+HDh/P3v/8du91e6/urKv/617/46KOPGDt2LJWVlSQmJgLwpz/9iX/+85+0b9+ebt26MWzYMO68807Gjx/P8OHDWbRoEQcPHuT5558Prb3xxhtZsWIFDoeDxx9/nDPPPJN169Zx9dVX43a78fv9vPnmm9x7771s3ryZ7Oxszj33XG6++WZ+9KMf8fXXX+Pz+bjnnnuYP38+NpuN6667jl//un4HmKpy9913M2/ePESEP/zhD0yePJmbb76Z888/n4kTJzJp0iTatGnDCy+8wAsvvMDmzZt58MEHa/3cUlNTuf7661mwYAFPP/00Y8aMifnewYSAlJQUABYuXMidd96J1+vltNNO45lnniEhISHUnrddu3asWLGCO++8k08++YQZM2awbds2tmzZwrZt2/jNb37DrbfeClgegjlz5tChQ4fQ78HQPKjHi7/woBVKgfU3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Npst9L1T865XzW1V5dxzz40rd6l3797ceOONXHfddbRv375enVOXNklLSwvFIDcVje7WEJErRCQt8PpeEfm3iAw9wmP+HvACwTiB3UB3VR0C3A68KiIx4+pUdZaq5qhqTvv27Y/EjCZn2rRp3HfffVG3CcaOHRu61f/JJ5/Qrl070tPTGTduHK+++ioA8+bN48CBAwCcffbZvPHGG+zda4V+FxUVxbyiC7Jw4UIGDx7M9u3bKSgoYOvWrVx22WW89dZbjB49mnfeeYfKykrKysoibs/URri9GzduZNu2bfTt25ctW7Zw4okncuutt3LJJZewZs0a0tLSahXi5557Ls8991zoH7WoqCjmvFjvP3fuXHw+H/v27WPx4sWcfvrpAIwYMYInnniCcePGMXbsWB577DHGjh3boM8tFl6vly+++ILevXvTt29fCgoK+O677wB4+eWXOeOMMwCrmsjKlSsBePPNN+s97rhx43j77bepqKigtLSUd95557DsMhweWuWu9hiXlNWaeAcgaSkkXHIWqX+5g6SfXRwSx5KShK1LRxwndmsuD/LFYY/zgVLgkjjXPgnMV9V+WDklG5rEQoPBcMR8++23bNpUHd6Vn59Pjx49QmK4Xbt2lJWVNSgBftu2bXz2mXVt/Oqrr0aFGI4YMYKlS5eGvufKy8vZuHFj1HHee++9UJ7Upk2bsNvtZGZm1vnedWmTo0FT1EG+V1X/JSJjgLOBR4FngOF1L4uNiPwSK3nvbA18uqpaBVQFXq8Ukc1AHyD+miMtkK5du4YSssKZMWMG06ZNY/DgwSQnJzNnzhzAik2eMmUKAwcOZNSoUSEP+YABA5g5cybnnXcefr8fp9PJ008/TY8ePWK+b25uLpMmTYoYu+yyy3jmmWeYN28eEydOZPDgwXTs2JFBgwaRkZFR589x0003ceONNzJo0CAcDgezZ88mISGB119/nZdffhmn00mnTp343e9+R9u2bRk9ejSnnHIKF1xwATfffHPoONdeey0bN25k8ODBOJ1OrrvuuqhyMADXX389v/nNbwDrdtCyZcv47LPPOPXUUxERHnnkETp16gRY4vnDDz/kpJNOokePHhQVFYUE8uF+buHcddddzJw5E7fbzdlnn82Pf/xjRIQXX3yRK664IpSkd8MNN4R+d9dccw333nsv48ePr/f4Q4cOZfLkyZx66ql06NCB0047rd41hsNHq9yWx7i0vP7Eu45ZuM4bjXNkNuIKNKiz27BlpCGZ6Yiz2cvM/0NVl4YPiMhooM6kaRHJAMYBvwRQVTdWorTBYGiBlJWV8etf/5qDBw/icDg46aSTmDVrFpmZmVx33XWccsopdOrUqUHfG3379uXpp59m2rRpDBgwgBtvvDFif/v27Zk9ezZTpkyhqqoKgJkzZ4ZCC4O8/PLL3HbbbSQnJ+NwOHjllVfqvStblzYJ5mI1JRJe+aBRDiiyWlWHiMifgbWq+mpwLI61PYF3w6pYTAAeB85Q1X1h89oDRarqE5ETgTxgkKrW6WLMycnRmklmGzZsoH///of3Q7YyysrKSE1N5dChQ4wbN45Zs2YxdOgR3RQwNBHm77lhRAhjrw/vynVUfbA0MrY4gP2k7rjOH43j1H4hz7AkJViiOC2lURPxRGSlqubUPzPm2lWqOrS+sRjrsoFZwHos7/FKYLqqlofNCQ9dG3a4d1oMhuOJ4/W8W1BQEKoqdawS63cT73m1KVwcO0XkOeBc4C8ikkAcoRwikguMB9qJyA7gPqyqFQnAR4EvnWA5t3HAAyLiAfzADfWJY0PD+dWvfsX69euprKzkqquuMuLYcNwQIYwrq3AvXol7wTK0qDhyogiOIf0tYdy7e2hM0lOxtUlHElxH3/haEJGRwCigvYjcHrYrHag/kN76XhgK/FpVvxCRJ4H/Ae4NTlDVWVgimpycnMb1shgMBkMLoCkE8k+wyrU9FqhZfAJwV32Laknye76WuW8C9QduGhqFYJyzwXC8EC6M60y8czpwjh5KwrlhiXcuJ7bMNCQ9DbG3yF5LLiAV6/yeFjZeAsTTpnIHsENVg6243sASyAaDoRXRs2fPY9p7fKQ0ukBW1UMi8h+go4gEy0Z809jvYzAYDIeLVrnx7z+Alh3Ct3MP7g+W4vliDdTojiipybjOGo7zzOHY0qymL5KWYgnj5LrLEzY3qvop8KmIzFbVw459UNUfRGS7iPRV1W+xcknWN7qhBoPB0IJpik56v8YKj9iDFf4AVpmgwY39XgaDwRAPWlmFv/Ag/tJyfN98j/uDJXjjSbyz2y1RnJmGOJo96S4uROQJVf0N8H8iEhX+oKrxFNH+NfCKiLiALcDVjWymwWAwtGia4ow/Heirqg0v5GswGAyNgFZW4d9/AH9JGd4VdSTe9e6Oa0J14p0kJSJt0pHU5KPa/a6ReDnw/FhDD6Cq+Vh1kw0Gg6FV0hQCeTtQXO8sg8FgaCK0otLyGBcexJ23EvdHdSTenTcax0ndwWazku4y01pU0t3hoqorA8+f1jfXYDAYDLFpigyTLcAnIvJbEbk9+GiC9zkuKCwsDPUf79SpE126dAltu92NV3p0w4YNnHHGGWRnZ9O/f/9QLcMFCxZw6aWXRsydOnUqb7/9dmh7z549OBwO/vGPf0TM69q1K4MGDWLw4MFMmDAh1GDDYGgutKIS344f8Kz5loqX/kPp3Y9RNXdepDh2OnCOP52UmdNJvmkKzoEnYevYDnvvbtg7Zh3T4jgcERktIh+JyEYR2SIi34tI3T3nDQbDMUlqamro9fvvv0+fPn0Ou9HV4TJ+/Hhqls4FePfddxkyZAinnnoqAwYM4LnnngOsng6PPRZ5Y6tnz57s378/tP32228jInzzTXXqWkFBAUlJSWRnZzNgwABuuOGGUCfapqQpPMjbAg9X4GGog6ysrFCrxBkzZpCamsqdd94ZMUdVUVVsR9CN65ZbbuHuu+/moosuQlUPKzP19ddfZ+TIkeTm5nLttddG7MvLyyMzM5O7776bhx9+mMcff7zBNhoMDUUPWR5j76YC3B8uw/P5V/Um3oW8xUmJzWR1k/M8cBtWHWNfPXMNBsNxwMKFC7n11lv54IMP4mpyBVYHWEcj5Vh4PB5+9atf8eWXX9K1a1eqqqooKCiIe31ubi5jxowhNzeX+++/PzTeu3dv8vPz8Xq9nHXWWbz99tv8+Mc/bhSba6MpqljcDyAiqYHtssZ+j6Zi5F+2NdmxP7une/2Twvjuu++YOHEiQ4YMYfXq1Xz00UesWbOGBx54gKqqKk4++WReeOEFUlJSWL58OXfeeSdlZWV06NCB2bNn07Fjx4jj7d69m65duwJWL/Wa7azrIjc3l6eeeorLL7+c3bt3c8IJJ0TNCTYQMRiOFqqKlh2yhPFX3+CeX0viXYe2VuLdqCFW++eMNCQjDXHEUxL4mKZYVec1txEGQ2uiaOzUJjt227x/1rl/8eLFXHfddbz//vv07t0bgH379nHDDTewbZulb5544glGjx7NjBkz2Lx5M1u2bKF79+6cf/75/Pe//+XQoUNs3ryZSZMm8cgjjwDw4Ycfct9991FVVUXv3r158cUXIzzW4ZSWluL1esnKsspiJiQk0Ldv37h+vrKyMpYsWcKiRYu4+OKLIwRyEIfDwahRo0KtrZuSRg+xEJFTRGQ1sA5YJyIrRWRgY79Pa+Cbb77htttuY/369TidTh5++GEWLlzIqlWrGDx4ME8++SRVVVVMnz6dN998k5UrVzJ16lTuvffeqGPdfvvtjBs3jgsvvJAnnniC4uLqW86LFi0KhXVkZ2fz/vvvh/YVFBRQVFTEsGHDuOKKK3j99dejjq2qvPvuu4clug2GhqJ+P/4DxXg3b6Pq3U8o++NTHHrsxShxbO/dnaSbppAyczoJF52BvVdXHCd2w5aV2RrEMcAiEXlUREaKyNDgo7mNMhgMjU9VVRWXXnopb7/9Nv369QuNT58+ndtuu43ly5fz5ptvRtwFXr9+PQsWLCA3NxeA/Px85s6dy9q1a5k7dy7bt29n//79zJw5kwULFrBq1SpycnLqvFPctm1bJk6cSI8ePZgyZQqvvPJKRDjEX//61wi9sWtXddL0f/7zHyZMmECfPn3Iyspi5cqVUcc/dOgQCxcuPCp6oylCLGYBt6vqIgARGQ/8P6zOTobDoHfv3uTkWInky5YtY/369YwaZX2MbrebMWPGsGHDBtatW8c555wDgM/nC3mKw7n22mu54IIL+OCDD3jrrbeYNWtWKLTjzDPPjIg5njq1+gr4tddeY/LkyQBceeWV3HTTTUyfPj20f+zYsdhsNrKzs7nnnnsa+RMwGKpRrxc9UIKv8CCeZfm45+fh370vcpIIjux+uM4fg6NvT8tbnJmOOI+NEm2NzPDAc3g1CgXOagZbDAZDE+J0Ohk1ahTPP/88Tz75ZGh8wYIFrF9fXca8pKSEsjLrxv7EiRNJSqqu63722WeTkZEBwIABA9i6dSsHDx5k/fr1jB49GrC0x8iRI+u05R//+Adr165lwYIFPPbYY3z00UfMnj0bgNtuuy0ijLRnz56h17m5uSF9ceWVV5Kbm8uwYcMA2Lx5M9nZ2YgIl1xyCRdccMHhfkSHTVN8a6QExTGAqn4iIilN8D6NzuGGQTQ1KSnVH5uqMmHCBF5++eWIOatXr2bw4MHk5eXVe7wuXbowbdo0pk2bRr9+/diwYUO9a3Jzc9m/fz9z5swBYNeuXWzZsoUTTzwRqI5BNhiaCq1y4z9Qgn9vIZ4lq6j6YEl0RQqHA+foIVZFih6drRJtaSnHYom2RkNVz2xuGwyG1kZ9YRBNhc1m4/XXX+fss8/moYce4ne/+x0Afr+fzz//nMTE6FyLcI0BVjhEELvdjtfrRVU599xzQ17meBk0aBCDBg3i5z//Ob169QoJ5NooKiri448/Zu3atYgIPp8PEeHRRx8FqmOQjyZNUsVCRO4VkZ6Bxx+wKlsYjoBRo0bx6aefsmWL9VGWl5ezadMmBgwYwM6dO/nyyy8B6+pu3bp1Uevnz5+P1+sFLJF74MABOnfuXOd7rl+/Hq/Xy86dOykoKKCgoIC77rqL1157rZF/OoMhGj1UgW/HD3jXfUflK+9Q9j+PU5n7XqQ4TkzANWEMqX+5g+Rbfobr9EHYe3TGlp7aqsUxQHgVobDHNSKS3dy2GQyGxic5OZn33nuPV155heeffx6A8847j6eeeio053BF5ogRI1i6dGko5re8vJyNGzfWOr+srIxPPvkk4v3iSRZ84403+PnPf87WrVspKChg+/bt9OrVKy7nX1PRFB7kacD9wL8D23mBMcMR0LFjR55//nkmT54cKv/20EMPcfLJJ/PGG29w6623UlJSgs/n44477mDgwMiw73nz5jF9+nQSExMREZ544gnat29f53vm5uYyadKkiLHLLruMq666KnR1ajA0JsHEOy0qxvfDftwfLcP96XKorIqYJ6nJuM4ZievsEdg7d0DaZhwzne6OIjmBxzuB7R8Ba4AbRORfqvpIs1lmMBiahLZt2zJ//nzGjRtH+/bt+dvf/sbNN9/M4MGD8Xq9jBs3jmeffTbu47Vv357Zs2czZcoUqqqs8/DMmTPp06dPzPmqyiOPPML1119PUlISKSkp9XqPwdIbNcM0L7vsspjjRwtRjepEetySk5OjNWv2bdiwgf79+zeTRQZD43Ks/j2r348Wl1qhFDv3UvXBEjxLV0PgrkcQaZtBwoQxOMfmWDWL22Qc1wl3IrJSVRvU0U5EFgMXBisJBSoLvQdMAFaq6oDGsDHWedVgaE0cq+fd1kCs302859W4XC4ikgR0V9Vv65jzhKr+RkTewUoEiUBVJ8bzXgaDofUQTLzzF5fiK9hJ1bw8vMu/hhoX7rYT2uO6YCzOEdnY27exhLG9KSLEjis6AOGudw/QUVUrRKSqljUGg8FgIA6BLCIXA49hNf3oFYhfeyCG4A1mjz2GwWAw1EEw8U6LS/Fu2or7/cV410bHtdl6dSXhwrE4hg7AntXGqkhhhHG8vAJ8ISL/CWxfDLwaSJpeX/syg8FgMMTjQZ4BnA58AqCq+SLSq+YkVQ0WrMtW1SfD94nIdODTI7K0CVHVVp/QYzj2ORbCpfRQBf6iYvxlh/Cu3YR73mJ8m6LbodoH9CbhwnHYB5yEPSsTyUxDjqCTZGtEVf8kIvOpLrF5g6oGYyF+1kxmGQwGwzFBPALZo6rFNQRkXd/EVwFP1hj7ZYyxFkFiYiKFhYVkZWUZkWw4ZlFVCgsLY5byaW7CE+/85YfwrlhH1bzF+HeioJZiAAAgAElEQVTsiZwogmNofxIuGIe9d3dsWRlWxzsjjBuMqi4Xka1AIoCIdFfVpmsZajAYDMcJ8QjkdSLyU8AuIicDtwLLak4SkSnAT7HCMP4btisNKGoMY5uCrl27smPHDvbt21f/ZIOhBZOYmBizSUxzEZ54p4cq8CzLp2p+HrrvQOREuw3niGxcE8Zg73YCtrYZlsfYXLAeESIyEfhfoDOwF+gOfAOYzqYGg8FQD/EI5F8Dv8dK9sgFPgD+FGPeMmA30A7rpBykFKu0UJ2IyAtYZYj2quopgbG2wFygJ1AA/ERVD4j1zfkkcCFwCPilqq6K42eJwul00qtXVMSIwWBoIOGJd1pegfuT5bg/WooWl0VOdDlxjcvBdd5obB2zsLXNRDJM/eJG5E/ACGCBqg4RkTOBqfWsMRgMBgNxNApR1UOq+ntVPU1VcwKvK2PM26qqn2DFtn2hqp+q6qfABiAet9ZsrPJD4fwPsFBVTwYWBrYBLgBODjx+BTwTx/ENBkMTolVufD/sx7d5O96tu6h880NK736Mqjc+iBTHyUm4Lh5P6l/uIPEXl+AY0Bt7r67YjNe4sfGoaiFgExFboMNpg0rGGQyGlkthYSHZ2dlkZ2fTqVMnunTpEtoO9k1oDDZs2MAZZ5xBdnY2/fv358YbbwSsdtaXXnppxNypU6fy9ttvh7b37NmDw+HgH//4R8S8rl27MmjQIAYPHsyECRPYu3dvo9l7pMRTxSIH+B2WFzc0X1UH17LkdaqTQgB8wL+A0+p6H1VdLCI9awxfAowPvJ6DlSh4T2D8JbWykj4XkUwROUFVd9f38xgMhsYlmHin5RX4Cw/i/mAp7iUrwe2JmCeZabjOHY3rjBwkPRVbVmarbwfdxBwM1D5eDLwiInuB8ma2yWAwNDJZWVmhDnkzZswgNTWVO++8M2KOqqKq2I4gp+OWW27h7rvv5qKLLkJV+frrr+Ne+/rrrzNy5Ehyc3O59tprI/bl5eWRmZnJ3XffzcMPP8zjjz/eYBsbk3hCLF4B7gLWAv54jqmqoUsWVXWLiKuB9nUME70/AB0Dr7sA28Pm7QiMGYFsMBwFwhPvtLIK3669uOcvwfPFV+CLPE3YOrTFNWEszpHZ2FKSkXaZ2NJSmsnyVsUlQCVwG9advQzggWa1KAxfwU6w28HlRBJciMsJCS5Txu8YRf1+UFr972/kX5ouB/aze7of1vzvvvuOiRMnMmTIEFavXs1HH33EmjVreOCBB6iqquLkk0/mhRdeICUlheXLl3PnnXdSVlZGhw4dmD17Nh07dow43u7du0N5LiLCoEGD4rYlNzeXp556issvv5zdu3dzwgknRM0ZN24cs2bNOqyfsSmJRyDvU9X/1j+ter6ITAyuEZFLgP0Nsi4MVVUROew6ViLyK6wwDLp3P7w/LoPBEEl44h0eL74tO6iatxhv/jfRzT26dSLhwnE4hg3ElpSIZBlhfDRR1XIAEUmnut10i0G9Xqhyw6GKyLJIdjuS4DLCuZlQrw/8fvBZz+rzWxe94dvB/T5FA+Oh/3+bDXE6rN+fww5OJzgd1WPmjtFR5ZtvvuGll14iJyeHvXv38vDDD7Nw4UKSk5N58MEHefLJJ7njjjuYPn06//3vf2nXrh2vvPIK9957b5RYvf322xk3bhyjR4/mvPPO4+qrryYjIwOARYsWkZ2dHZq7bds2Lr/8cgAKCgooKipi2LBhXHHFFbz++utMnz494tiqyrvvvntYorupiUcg3yci/8CKAQ51X1LVf9cy/was23n/BwiWp/cXDbRvTzB0QkROwMrEBtgJdAub1zUwFoWqzgJmgdUStYF2GAytGq1yW8K4pAz1+vBt2ELV+4vxfbMlaq69T0+rhvHAk6qFcWpyM1jduhGR64H7sbzIfqzzsQInNqdd9eLzoYcqYgvnoFgOiOeQCDNEoP6giLUeIREbELfq84X24fNZ84PC90jx+9EqN1S5Y9eDtdsRlwOcTks0B8VzcNvQqPTu3ZucHCv1YNmyZaxfv55Ro6woWLfbzZgxY9iwYQPr1q3jnHPOAcDn88WsiHTttddywQUX8MEHH/DWW28xa9asUGjHmWeeGRFzPHVqdT7wa6+9xuTJkwG48soruemmmyIE8tixY7HZbGRnZ3PPPfc08ifQcOL5a7wa6Ac4qQ6xUCCmQFbVzcCIQOwbqloWa16c/BerrvLDgef/hI3fIiKvAcOBYhN/bDA0Lur3oyXlaHEpWlmF+v14V2+gal4e/oLo61HHqX1xXTAOx0ndkaQEK8Y4xQjjZuRO4BRVPeI7eC0Cnw+t8EFFZasRziHhGu699fri9+a2REK/x6rYAtrpQGp6nQOe6GPhd3q4YRBNTUpK9V07VWXChAm8/PLLEXNWr17N4MGDycvLq/d4Xbp0Ydq0aUybNo1+/fqxYcOGetfk5uayf/9+5syZA8CuXbvYsmULJ55oXasHY5BbGvEI5NNUtW99k0Rkqqr+U0RurzEOgKrWGXUtIrlYCXntRGQHcB+WMH5dRK4BtgI/CUx/H6vE23dYZd6ujuPnMBgMcaAVlfiLy9CSMlDFX3YIz2f5eD5djv+HGlrLZsN52im4LhiLvWsnJCkRW7tMJDmpeYw3hLMZ6/x4fFOrcLYhLhckOBGXC0lwgsvVbCIrPHRBg6K3pkfX64v0+LZkodtUeLyoxwvE6EhmsyEOB7gc4HBEe6JNU6E6GTVqFNOnTw+J0/Lycnbt2sWAAQPYuXMnX375Jaeffjput5tNmzYxcGBkyfT58+dzzjnn4HA42LVrFwcOHKBz58519pFYv349Xq+XnTurnSq///3vee211/jd737XZD9rYxCPQF4mIgNUdX0984KXKWkNMURVp9Sy6+wYcxW4uSHvYzAYolGvDy0pw19cCm4PqopvYwHuxSvwrlwPXm/kAocD59ihJJw3Blv7NkhykiWMk1peJ79WzG+xzt9fEBked2vzmXQU8fnRispGF86qWi1uQ2I3KHjDxG8oftcXlbhqaCB+P+p2Q6B0WZSAttsivc9OpyWiHQEB3crjnzt27Mjzzz/P5MmTQ+XfHnroIU4++WTeeOMNbr31VkpKSvD5fNxxxx1RAnnevHlMnz6dxMRERIQnnniC9u3b1/meubm5TJo0KWLssssu46qrrmrxAlm0nitUEdkA9Aa+xzrJCpZGra3MW4slJydHV6xY0dxmGAwtAlVFyyusEIoyy9HoLy3Hs2w1nsUr8O8pjF6UlIBr/Om4zhmFLSMVSU22Ot8ZYdwkiMhKVW1Q7WIR+RJYQo0KRKo6p5HMAxp+XvV+t7VlCcdw4Wy3R8fpBsVua/TqHi/YbNbv2W4Hu80Kzwk8Exir3g7sj0NUb9iwgf79+x+FH8BwuMT63cR7Xo3Hg1yzeUdMRORvde1vNV4Lg6GFo25PwFtcBl4v6vfj+/Z73J+uwLt6gyUCamDr2QXXuBycpw9CEhOQtBRLGCcmNMNPYIgTp6reXv80A1C7x9lw/BBIXgyGcEAML3RNgqLaVkM4B4W0ww5+teLFA2K6tXuqjxdqFcgikq6qJVitouNhZeB5NDAAq0U0wBVAfeEZBoOhCVG/36pbfLDUEgGAv7gUz9LVuPNWoPsORC9KSsA5/FRc44Zh794ZwBLGWZlWIpShpTMvUObyHSJDLIqazySD4RgjKKprDIdvq88X0RjJ2ifW/fagWA491xyz5hlR3fKoy4P8KvAjLOGrWL/WIFGlgoK37UTkRmCMqnoD288C9adGGgyGRkcrq/AXl6Il5dZJ3u/Ht36zFVv81Tcxb3HbT+yGc1wOztNOsYSw3W61gc5IM2WYji2CeR2/DRtr+WXeDIZjjEDcaQ2Rq9Z/W5whOYqATSzRLNWvjXBuOPWFENdHrd92qvqjwHOvwzxmGyAdCHopUgNjBoPhKKA+P1pSZsUWV1mJGP6DJXiWrMKdtxItPBi9KDkR14hsnOOGYe/aCQBJTkIy05DUZHOSPgZpwLnbYDA0gASxUXjgAFlt2hzBuVLBHy3oooRzQDybc3LdqCqFhYUkJjY8P6Zed5CILFTVs+sbC+NhYLWILMK6sBoHzGiwhQaDIS70UAX+g4GEO7Vi4rxfb8KzeAXeNRtjNgGwn9zD8hYPG2jVkrXbsKWnIpnp1rbBYDAY6uQERyK7C4vYv3//0Y1fl+owDqkZ0mEgMTExZsOTeKkrBjkRSMaqS9yG6hCLdKBLbetU9UURmYfVwAPgHlX9ocEWGgyGWlGvFz1odbgjkHjiLyrGnbcSz9JVaFFx1BpJScI5agjOscOwd+5gjSUlWKI4LcV4JgwGg+EwcNpsdHe1kKZIdltk45zga4cJjztc6vrErgd+A3TGikMOfmuWAP9X2yKxvl3PAU5U1QdEpLuInK6qXzaSzQZDq0ZVrYS74lK0vMIa8/nwrtmIJ28F3rWbYsa92fv2wjUuB8fQ/latUJsNSU/Blpluku6OI0RktKouFZEEVa2qf4XBYDhu8PnRiqroToW2GsI5WP/b5JXUSl0xyE8CT4rIr1X1qcM45t+xam6eBTyAVQXjTeC0IzHUYGjtaJUbLQ54iwPJdf79B6q9xQejC85IajLO0UMtb3GndtZYgsvyFqenmM5Txyd/A4YBnwFDm9kWg8HQEvD70coqqKxFOId7m4OvWzn1Xjqo6lMiMgroGT5fVV+qZclwVR0qIqsD8w6IiHFPGQwNQP1+tKTc8hZXWs5A9frwfvUN7sUr8K3fHNtb3L83rjNycGT3s26tiSDpqVZzD9PU43jHIyKzgC6x6tObmvQGgyFEbcJZpFo4B7sSOu3VXQlbgXMlniS9l7E66eUDwQ4CCtQmkD0iYg/MQUTaE9bFyWAw1I9WVOIvLkNLykIC2L+n0PIWL1ttjddA0lNxjhmKa8wwbB3aWoMup1WiLT3NKmxvaA38CCvM7Xyq69MbDAZD/KhaVZCq3LETD8PbejvsEN7i2+E4Lr5v4gk+yQEGaPwF5f4GvAV0EJEHgcuBPzTQPoOh1aBeX6DDXWmo6Lx6vHhXb8CdtwLfhi3Ri0SwDzzJii0e3Nc6URFo6JGZjiQbb3FrQ1X3A6+JyAZV/aqhxwk4OlYAO4NlPw0GgwGwYp19MTzPQWy2gOc5IJgDr0MCOvBd1ZKJRyB/DXQCdsdzQFV9RURWAmdjJfZdqqobGm6iwXB8EyrPVloeGvP9sB9P3go8S1dbZdtqIJlpOMcMwzVmKLZ2gTLjTge2jEBDj2Pg5GNocgpF5C2s7qZgNWyarqo74lw/HdiAVbnIYDAY4sfvD3mgIUZLb5GAB9oe8EI7rHAOR9h2MxOPBe2A9SLyJZHtSifWnBjwOKxT1X7AN41mpcFwnKFen5VwV1waKs+mHi/eVetwf7oC38aC6EUiOAb1wTluGI5BfRB7wFucmmyFUaS0kDJDhpbCi1gdUa8IbE8NjJ1b30IR6QpcBDwI3N5UBhqOTbTKjb+oGC0qxl9UjL/oIFpUglZWYWuXia1DFrYObbF1yELapLeKeFXDYaKKut3gDmzW3C9SLZSDYRwuZ2gbh73JS5LGI5BnxHswVfWJyLci0l1VtzXcLIPh+ETLD1mxxWHeYn9RMe5Pl+NZvCJiPIi0zcA1ZijOMcOwtc2wBh0OK+EuM61FXGkbWiQdVPXFsO3ZIvKbONc+AdwNpMXaKSK/An4F0L179yMy0tCyUJ8PLS7DX3gQPVCMY9jA0MU4gG/3Psrvjcr9rJXUx+5CMqtvQqjbg++7bdg6tEXaZhjxbIiNKrg9aDDcMMYUW1Zm9R3UJiCeKhafHuYx2wDrAh7n0Ld9LI+zwdAaUK/X+sIJ9xar4ttYgPvjL/Cu3hDd5c5mwzG4D85xp+E45aTQl4hp/2w4DPaLyFQgN7A9BSisb5GI/AjYq6orRWR8rDmqOguYBZCTk3NUm4cZjgxVxb/9h5DX1190MMIbrAdLI85HqX/pjmRlhrZtbQ4j4sblRDIir7H8P+zj0OOzrQ2HHVu7NpbHuWO119nWIQtpmx4hzA2GKGJ0h21M4qliUUq1eHcBTqBcVWv7L7m3kWwzGI5ptPxQdevn4FhlFZ4v1uD++HP8O/dGrZE26bjOOA3nmKHYgl4Xu606ttjUpjTEzzTgKeCvWOfwZcDVcawbDUwUkQuBRCBdRP6pqlObzFJDo6AeT0D0BsMeinGcPhh7x6zQHBGh/NHnoSK+HjL+omJsYQJZEhOQtBRIcGFrm4GtbQbSNsOa43Ki+w/g31uIf2+RlYxV40LevyfsGs3rw//Dfvw/7I9+Y7sd+8k9SLkz8k9WPR4rAcyIZ0MTE48HOXT5F+iSdwkwoo75n4pIJ+B0rJPyctNq2tBaCLV+Li4Drzc07ttTiGfRF7iXroaKyqh19r69cJ013KpbHIwtTkq0vMWm/bOhAajqVuCw79yp6m+B3wIEPMh3GnHcsvCu+w7fzj2W17fwIP4DJWjhwZghWraOWRECGcDWNiPmBXoQSU+1RG/bjJgX5amP39Pwc5LTif2k7vj3FsUsVxnC56vu3xuGJ28VlXPftzzP7duGvM8S9D5nZZokZUOjcFjBi4FSb2+LyH3A/8SaIyLXAn8EPsb6835KRB5Q1ReO1FiDoaXiD7Z+DvcW+/14v/4O98ef4/t6U/SiBBfOEafiOms49i4drTGbzWrokZlm2j8bDMcx6vejhyrREisnIfjsLykPGyvHOWIwrjOHR6yt+mhZ7HNKDPyFxVFj9pN7IpnpVgxnm3SkbSa2rAxsbTKs0AZn3XeqjuSC3ZndD2d2P8C6oxb0Nvv3FuLfUxTa1uJSbB2yotb79xaCz49/T2HAG13jc7DZkKxMbB3a4jxtEK4xkc0k/UXFVqibTQAJPGMlhYUe1rYkJUa1YtYqtxUfG2N+8GEcGscH8YRY/Dhs04ZVFznaBVbNXcAQVS0MrM/CurXXIIEsIn2BuWFDJ2IJ8EzgOmBfYPx3qvp+Q97DYGgI6vEGKlFEeou1vAL30lW4F32B7jsQtc7WMQvnmcNxjcpGkpOsQafD+qLKSDNJK4YWg6p+AnzSFMcu+8OTaEk5JCZYQiQpIfBIhKTgmDXuyO6PLSM10rZDlZDoalH/L+rxhsSuv6QcLS2zGvgM6hMxr/KtBbjn54VaxteFrccJ0WNtM0JduyJ32JA26dVhD20zsPfuFjUtaerF8f5ITYokJmDv3hl7985R+7SyCvV4o8fLo8teRuD3o/uK8O0rwt6rS9Tuimfn4tuyPS77km6YjDPnlIixsj8+hRYerH+xCMn3XIvjpMgk1pJbHwp4x8OEuMOBvUdn7H16YO/TC3uPzsYL3gKIx4Mc/p/kBQqwwixqoxAoDdsuJY7EkNpQ1W+BbAiVkduJ1YjkauCvqvpYQ49tMBwuqoqWV6AHS9Dyioh9vu0/4F70BZ7Pvwo1+ggRKNHmOms49gG9q5PukhKQNhnY0lKO1o9gMLQItLjMuuNSWh670UAYKT06Q5hAVlVKpz9kefISXCFhLUkJEBTbidWi23XuqIgW6+r14d9fFJqDyxnT66eqUOVGEhMixr2bt+FZll/t6S0tx19SFjOu1zG4b5RAFqcjLnEMWBcRNY85oDficCBBr29WBra2mUhGaou6YDgSJDEh6nMHSLrmchKnTsS/r8jyIu8tCntdiB4oCc21tY/2QMeuh1CbETE8wfH2TFONGSJCVVXU714B79qNeNdutAZcTuy9u5M49eKo8BjD0aNOgRwQpGtU9a+HcczvgC9E5D9Yv/dLgDUicjuAqj7eUGOxmo9sVtWt5haG4WgS8hYfLLWu/oPjXh/e1etxf/wFvk1boxcmJ+EaOxTX+NOxtW8bGpa0FMtjnGQ63RmaFhEZgVWuMxF4QlXfbl6LLLQyviQxAGoKpeBt7sBrrXJb1RdqwXnWiAitosWllP8hrFSZ3WaJsaDIhpDwtXVsR+oDv460fd8BPJ8uj8t0fy1t4QFISsCWnmrlGaSlWLG/6SnY0qxnSUuJWcbKmXNKlGezNSEJLuxdO2Hv2ilqn7o9lmDeW4i9R7QHWdqkI+3bWOpEtfoB4FdAA89Y9XZrrnc50WBcdnC+hq2JENAxdIo/DoHt9uDbsBlbSlLkz+axSuTZT+xmQvCOAnUK5EBd4ylYWdDxsjnwCPKfwHPMepqHyZVUlywCuEVEfoHVDvUOVY26n23qdRoaiqqiwdjiGt5if3EpnsUrcH+6POYXs61bJ1xnjcB5+qDqE1kwvrhtRlRcm8HQWIhIpxqJ0bcDk7C+rb8AWoRATnv6Xuv/q6IKKiqtW+qHAs/BsYoqq/lEjTssWuW2RHOcIrumJ1IP1YgS9Pmt//Hyiij/Ysza5LXd8bHZAkI3IG7TU7F1ahc1zTnyVJwjT6031tdw+IjLib1Lx+q8jhok3zjliI6fOnN6vXM0KLpjOPLSnvq99SJMjPvLK/BtKsD3bQHeTQXo/oPYunREUiObP/m+38mh/51tVfjo2Rl7n544+vbCflL3mN52w5ERz7f0UhH5P6w44PC6xqtiTVbV+xvJtghExIWVkf3bwNAzwJ+wrgP/BPwvVlmjmvaYep2Gw0I9XvRgiRVbHO4tVsW3ZbtVu3jFuoh9ANhtOIYOwHXWCOuEFTw5OsLii+3Hx+1PQ4vmWRFZBTyiqpXAQeBywA+U1LnyKCLBGrkZh+87sWWkkf5/f0D9fqh0B0R1QFBXVFaL64oqtModHc+piq1D29Cc8ByCmqjPh/r9EaELti4dSfzpRZbHN61aDJOcGFeIgxHGxzcSTNiLtS+GkLWnJluhFGOGAVhNWmLcefB9+33ghQ/f5u34Nm/HPS8PRLD16IyjT09LNJ/cA6nhfTYcPvEI5OzA8wNhYwqc1fjm1MkFwCpV3QMQfAYQkf8HvHuU7TEcR4S8xQdL0UOR3mJ1e/B8uRb3x1/g37Yraq1kpOIcdxquM3Kqaxdj3QaUthmmTJvhqKKql4rIxcC7IvIS8Bvgp0AycGmzGtfIiM1midLkRCAj7nX27ieQ+tBtoW31eK2Qj6DAVq0Oe4hR5syWmYbrrFqrnRoMR4QtKxPCak8HkZQkbJ074N9Vo0SfKv6CnbgLdsKHS0EE15nDSfzpRUfJ4uOTeOogn3k0DImDKYSFV4jICaq6O7A5Cfi6WawyHNOo21NdiaKGR9i//wDuT77Ek7cyKsQCwH5Sd6t28dABEe2eJTXZSpxJNvHFhuZBVd8RkfeBm7CSmh9U1cXNbFaLRZwOK+zJJMsaWjCus0bgOmsE/tJyfBsL8G3aivfb7/Hv2BMZ+6yKZEVfMLo/y0fsNux9emHLbIyo1+ObRg+EFJG2qlpUY6yXqn5/BMdMAc4Frg8bfkREsrG82QU19hkMtRLyFh8osbxFNfb5NmzB/fHneL/6Njpj2enAOfxUXGedHlmaSATJSLWEsel2Z2hGRGQicBtW1aGHgJeBe0XkJuD3qrq5rvUGg6FlY0tLwTZsIM5hAwGrtKh301Z8mwrwfluAf9tuHH16Rq1zv/tJqJOhrUNbq6Rc3544+vSM6JZosGiKTKF3ROQCVS0BEJEBwOtAg1NuVbUcyKox9vMjstLQ6lCvz/IWHyiJ8hZrRSWez/KtMIoYbU+lXSauM4fjHD0UW3jihN1eHV9s6lYaWgYzsTqZJgEfqOrpwB0icjLwIFays8FgOE6QlKSoBizUcNT4D5ZGtPm2mrMU4Vmy0jpGVmZ1DHOfnkiHts0SGhhMcKwZy+8vLkMrKsDrs5JqvT7s3TvFbCbTWNQqkEXkClX9VwO8vw9hieSLgL7AS8DPjtBOg6HBqNuD/0AxWlwW5RH27dqLe9GXeJattkpH1cA+8CRcZ43AMejkiH9YcbmsjlPpqSa+2NDSKAZ+jBVzHApWVNVNGHFsMBz3xKxoIYLr4vH4Nm7Ft3l7VGKqFh7E81k+ns/yAUj933uQsNrjvq278G7aGhCoPjTwHLXt82Hv1Q3XWdHdHz1frLHeNyBwY673+nCdP4bEK86PWF+Z+66VHB9GwqVn4zwlssZ4Y1KXB/m3wL+AN4GhdcyLQFXfExEn8CFWabdJqrrxiKw0GBqAHqrAf6Akov0zBFpAf/WNVbt4w5bohYkJuEYPwXnm6dg7tY/YJSlJVpm2ZJMhbGixTMLK2fBgJecZDIZWji0jlcRLzgaspFTf9zvwbSzAu7EA33fbIppb2Tq1i+pc6f3me6r+NT+u91KvL0og68ES/AU74zO2ZoUoQOwx7tDWUX2mMahLIBeKyIdALxH5b82dqjoxfFtEnqK6RY1gpRRvxqpVjKre2kg2Gwy1oqpWgf+iYqtWahj+omI8S1fhzluJFhVHrbV1bo/rzBFWfdLwK3ARq35xm3RTnN3Q4lHV/cBTzW2HwWBomYjTgSMQSpGAJWh9W3dZiX8bC7Cd0D56zeGEEHpjNEKPJXBrQWN0mZTMdGwds8BhB7sdcdiRGE10GpO6BPJFWJ7jl7FqDNfHinq2DYYmQ33+6vjisKtK9XrxfvUtnryVeNd9F510J4JjSH+rBXTfXpHhEnYbtsx0JDPdxBcbDAaD4bhEHHYcvbvh6N0NLhgbc46tWydcZ4+whG6YSA1uS2jcFrP7o+uM03Bm97fmxFofWIvdHrOWeOIV50ONsAtbm/SoeY1JrQJZVd3A5yIySlX3iUhqYDy6erU1Pif4WkTaBsaKYs01GBoLK764BC0ujRC/vt378CxZiWdZfuxOWKnJOMfl4DrjtOjsXZfTqkaRYeKLDQaDwWAIepwbSm21nVsy8VSx6BgItWgLiIjsA65S1Yi6wyLSHXgEq4FIcWBuOvAx8D+qWtColhtaNXqoEv/Bkgjxq1VuPCu+xrNkFb5NW2Ousw/ojWvMMBxD+ke1e5bkJGxt05GU5JhrDYZjiUB5zApV9YtIH6AfME9VPW1XsycAACAASURBVPUsNRgMhlZPPAJ5FnC7qi4CEJHxgbFRNebNBZ4AfqaqvsBcO3AF8Bpg2g4ZjohQ/eKiYquMTWDMv3UX7ryVVoZsYDwcaZOOc/RQXKOHYmsffetH0lOtxDsTX2w4vlgMjBWRNlhJ08uByZiqQoYmQFwusNtQj7fJk6cMhqNBPAI5JSiOAVT1k4BnoibtVHVu+EBAKL8mIn86QjsNrRj1+dGSUvxF1fHFWnYIzxdrcOetsLoI1cRuw3FqP5xjh+EYeFJ0TFMovjgtoguewXAcIap6SESuAf6uqo+ISH5zG2U4hhGxGiEluKxnl9NyLDgdEeFo6veD22OJ5So36vZY225PdB6IwdBCiUcZbBGRe7GS9QCmAjFqY7FSRP4OzAG2B8a6AVcBq4/UUEPrQz1e9ECx1Qba70f9fnzfFuBeshLvyvUxvRS2Tu1wjhmGc2R2VJkasMq0SVqK9YiRCGAwHEeIiIzE8hhfExgz2aaG+rHZkAQnuCKFcM2wtNoQmw0SE6xqQDXad6vHC2436vZGCmfjdTa0MOL5a58G3A/8G6uMW15grCa/wDoJ3w90CYztAN4Bnj9iSw2tBq2swl9UHIov9h8swbN0Ne4lK9F9B6IXuJw4c07BOXYY9pO6RyXWhURxagpiN6LY0GqYjlXP/i1VXSciJwKL6lljaE3YbVZoRIITCXqDXc4mvasmToflca5xHzrkdQ4XzcbrbGhG6v0vUNUDQL01jANVL54JPAyGw8ZfWo4eKEYrqlCvD+/ajVZ5trUbY54gbT274Bo7DOdpg5DkxIh9RhQbWjuquhgrDjm4vYU4zuWG4xCHI9ITHHzdgspXRnida1Dtdfagbm/L9zqLgM1mXYDYbdZrW6CEWXA78Bz8ftKyQ/hLD7Xcn6kVclSCL0Xkj6r6wNF4L8OxhfrD6hd7vPj2FOLJW4ln2Wq0JEZFweREnCNOxTVmGPbuJ0TsMqLYYKhGRNoDdwMDgdAVpKqe1WxGGZoWpyPSE+wKhEkc4+fDZvE6BwVsUNw67IFtsWr3xhTAARHcgPKgkpyErUMWWlmFlpbjLzsU0d3OcPQ5WtlJ1wJGIBtC6P9v787j3KrO+49/vtJoFu/7ghecEAghCWAwYGNDWBoCWZulTdI0e0PapEDatFnaX7N1I2l+aWjSNKWhWX4h+wIJCYsDYV9tYzDYgZCwGWzjDRvbs0l6fn+co5k7M9KMRiONNDPP+/XSS1dXV/c+I2nOPHPuc8/JZrG9+8k/+xzW3kH3hs1037Ke3MOPFd0+ffTzaD7tRJqWHxMa/ciTYudKupwwutCrgT8nXA+ys64Ruero3xNcuFBugl1XUX6vc3eY3S2V6LXt34tbSHoTvbr1oPjzpObOwjq7wsywzx3CurqGfrGrqqolyJL2l3oKaKvWcdzYZh2dYWKP/QfIPRGHZ7vzfmjvGLCtpk8ls3p5GJ5t/uze9Z4UO1eO2WZ2maSLzOwm4CZJ99Q7KDeIdAqlmyCTDmUR/Wcaa2oKyz6B0ZBK9TqPJWppDv/8zJkZkuUDh0LC3OnJ8mgYMkGW9Dngn4B24BrgWOCvzOzb/TZ9FjjJzAaMuSXpyf7r3MSSj+MX53fvjcOzrSf/xLaBG6ZSNB17FJk1J9L00iPD9JV4UuxcBQrnZ7dJehXwNGHCJzfaCtPqNnni6yrTkyzPnhF6xQvJcpGx/111lNODfI6ZfUTS64HHgDcQLvzonyB/CzgcKDIoLd8ZSZBubAr1xQfI7d1H7oHfhqmf1z0I3QMvQtDcWeGCu1OXk5oxNazzpNi5kfgnSdOBDwNfAqYBf1XfkMaZwRLfTEh6K61Jda4UNWfQrOkwa3oYDvXAwZAst3uyXE3lJMiFbV4F/NDM9hX7ZTez/1NqB2b20crCc2ORdXVj+54j+8TT4YK7WzeQ37F74IaZJjInHEPmtBWkjzocpVKeFDtXJWZ2VVzcB5xZz1jGlDgCwYDEt9DLW1jvia9rAMo0oZnTYeb0cG3Pc4dC7/Kh9nqHVhvpdOxNz6Apta2fKSdBvkrSbwglFn8Rr4weWDDqJjTL58OVtzv30H33Jrrv2Ej2/ochnx+wbWrJAppPW0HmlGNDQuxJsXNuJArDaqXUO+pAKjHUVmLYLRTXpdSzTCoV9lHY1g2LZXPQ3R3uCxLvY5+3dMD7q6KLfbYr9ZmU2qbP5up5frz/fVFTE5o5DWZOw7K5kCgfOIgdHIPJckyEey5IbRn9EVnKGQf5Y7EOeZ+Z5SQdAl5X+9B6SXoMeA7IAVkzWyFpFuEK7WWE0o8/jmM2u1FkhzrI7XmW7N2b6L7zPrrv3QLFaqLaWsicchzNa04gdfhhpKZM8qTYuYlMKUirdFKbSFp7RhcoPN/nJk9qa8zMeqeO7u6G7mwcJSKLdY+xiTzS6XBtSzrVeyagMIpFU2J5BEO2NQI1pdGMqTBjKpbLYwdjzfLB9sb6vPonwoWpzBsgLyjnIr1JwAeApcD5wGHAC4GrBntdDZxpZrsSjz8GXG9mF0v6WHzspRyjwLJZ8nv3h6HZbttAdt2DPbPe9Zc+8nAyp51I5sQXk5o1HU2bgiZPaogvv3OufpqOWFLvEFyCZbOJxLc3Gbbu3PiavCKXw3K5PqsGTRcLiXJP4hyX+yfXMaluxKH2lE6haVNg2pRwtvdge0iWDxwavWQ5ne5NfhssES6lnBKLrwPrgVPj46eAH1IiQY49u/09Z2bVHvH6dcAZcfmbwI14glwzZkb+uYPkNj1M14130333JmzPvqLbpubNounkY8msPJamFxweeoo9KXZuVElqAd5IOMvW09b7pE0Tk+XzvQlwd5yRLjtGe4FHUy4PuXyfJHrQd0rqvXizSHLdt5c6Pep/F5VKoamTYerkvsnywfaiJZHDlkyE+0xf3jizNparnAT5CDN7s6S3ApjZIQ1+zmEDsATYSyj+mQFsl7QDeJ+Zra8gTgOuk2TAf5vZpcB8MyuME7YdmF/Bft0QrLOL7i2/p/uGO+i+837y24rPM6AZU8mc9FIypxxL+iVHkvKk2Ll6u5Jwgd56wC9vnwAsmfD2T4b79Zq6GjGDbDZ8FoVVQ72mkFDHkU+UjheHxvGwe56vsj7JslkiWT4U/jEYKuZxkgiXUk6C3CWpjfgZSzqCwRvbtcCPzOzauP05hF6MrwNfAU6pIM41ZvaUpHnA2njRYA8zs5g8DyDpfEJpCEuXLq3g0BOP5fLkHn2SrrV30HX7veQfe6r4hpPayKx4MZlVx9G0/BhS06aEC+4a8BSTcxPQYjM7t95BuOqxXD4kX8nEt7sbunPeCzyWFco+4gQgJT/FYklzYUjBQlJdYaeUJDRlEkyZFGrOD7WH+QsOtqOmJmjJoObmcZkIl1JOgvwpwgQhSyRdDqwG3j3I9ivN7H2FB2Z2naTPm9n74ym/YTOzp+L9M5J+CpwM7JC00My2SVoIPFPitZcClwKsWLHCW49B5LbvpGvt7XTdvI7cQ48Vb2ybMzQdfzSZVcvJrDyO9Kxp0NY6Zi9kcG4cu13SS81sU70DcYOzbC708GazYTmbK7rOE+AJrqdnOvRRlugVjMMRJocljLMKpgtDF6YH7ciSBJMnkZ48qSY/xlhRzigW10laD6wklExc1O9iuf62Sfoo8L34+M2EZDYNDLvARdJkIGVmz8Xlc4DPAD8D3glcHO+vHO6+HeT3HaDrhjvpuuEuspseLn4aLp2m6SUvIHPqcppPO5HU3FmotaL/dZxzo2cN8C5JjxL+oopwwu3Y+oY1cVg225vsZmOymyssF9aPowvgXP2Z9ZbXMEhvdCrVk0T3Gd+7/7jfE7jzq5xRLK43s7OBXxRZV8yfAJ8EroiPb4vr0sAfVxDjfOCn8UNqAr5jZtdIugf4gaT3Ao9XuO8JKd/ZRfdN99D1qzvoXv8gdBW5flIi/cJlNK8+gcwZJ5NeODecWnHOjRXn1TuA8cjMepPdQuKbSyS7yd5f5xpVPo91dUGo6iidSKdjCUemKc4OmVjONI3rksqSCbKkVmASMEfSTHqH3p4GLCr1uti7fEGJpx8ZboBm9nvguCLrdwOlknTXj+XydN99P53X3kb3nRuhxMDhqWWLaF5zAs1nryR9+KLwS+CcG3PM7HFJxwGnxVW3mNl99YxpLLBsNkzZO6D3N4flskNfvOTceFKoj+7oLJ5Ep1MokxmXCfRg2c/7gQ8Rxj3ekFi/H/hyqRdJOgr4GwYOLXTWSAJ1w2dmZDc/Qtcvb6brlvXY3v1Ft0stnEtmzYk0v3wVTUcumxDF986Nd5IuAt4H/CSu+rakS83sS3UMq+GYGbR3hCv4D7SHXjXnXHlyeSzXOS4T6JIJspldAlwi6YJhNqg/BL4KfI0w850bZdlHt9J59S10//ou8tuLl4tr9gwyq5fTcs7qMCxb2pNi58aZ9wKnmNlBAEmfBe4ABm3PJS0BvkUobzPg0vj3YNyw7mxIiA8ewg51VGf8V+fcQMNJoJvSkEym65xAl3P+fJ+kd/RfaWbfKrF91sz+a2RhueHK7dhF17W30bn29pLDsmnqZDKnLqflnFNJn/hiT4qdG99E306KHL2lcoPJAh82sw2SpgLrJa01s821CHI09PQSHziEHezwXmLnGkUDJ9DlJMgnJZZbCXW/Gwg9DMX8XNIHgJ+SGC/ZzPZUGqQrLr93P5033EnXdbeR2/y74hu1tpBZeSwt56wms2q5l084N3F8HbgrDo0J8IfAZUO9KE7AtC0uPydpC+G6kzGVIFt3NiTEh9rDLGE+RJpzY88gCXRq5jQ0b3bNDl3OMG99LriTNIPeIdyKeWe8/9vkboDnDzs6N4B1dtF1yzo6f3kz2fWbi58azDSROfHFNJ+zmubTV/joE85NQGb2BUk3EoZ7A3i3md07nH1IWgYsB+7qt77hJmAqTG5gB9vJH2wvPjqPqxnr6sa6ukOPXhlj7TrX6CoZouAg8LxST5pZyedcZSyfJ7vxN3T+8ia6bl4H7UUmMpRoOv7okBSfcTKpKRN7gG/nJipJ08xsv6RZwGPxVnhuVrln8yRNAX4MfMjM+lzh2ygTMFlXd99aYu8lrpiZQWcXdqgj9LofihcuHmoPZSmHwjIH2/tuE58vOp6zFGd4S4cZ3prSvTPAFSatSKf7TmCRTiVeU3wb0qme6ZhJp3r3l5hdLqyPM8ylU+FmhO/IgFvvessXe37gzfLxuzbE9sW3y/eNJSVSc2eRWjCX1ILZoaTA1V054yD/nN4h8lLAMcAPimx3lpndIOkNxfZjZj8ptt6Vln10K11X30Ln2tuxXXuLbpM++vk0n3MqLWevIjVr+ihH6JxrQN8BXg2sp+/wpqLMs3mSMoTk+PJGart7p8CNyZr3EvdhZuFUdDK5TSSxhSTXYpJLYtkOdVR/7GazOFxets8X0f+NGYSE5swkvXAOqYVzw23B3DAXweS2ekc3oZTTg/z5xHIWeNzMthbZ7mXADcBrijxn9A415AaR3/0snWtvp+vqW8j9/smi26QWzqX5FWtoOe800ofNG+UInXONzMxeHe8rOpunMCvTZcAWM/tCNWOrROglPtSb1E2wXmIzw/buJ79jN/ntu8jv3dc3+T3YHhLdQpJbrxE50mloaQ7HL0yUMsE+q6oww3buIbtzD9z/cJ+nNG0KqQW9iXM63mvmtAk9412tlFODfFM5OzKzT8b7d480qInGOjrpujnWFd+7pWgDp6mTaT7rFFrOO530MUf4L4NzblDFZjwdYhbUgtXA24FNkjbGdX9nZr+sRZz9WT4P7R2hl/jgIeieGFMxW0dnSIB37CK3fVdvQrxjN3SO0qgbmSY0qQ1NbkVt8X5SG5rUBonlnvWT21Bba+jZbM4M+LtkhWQ5GyebyBWW86FnOZeDbL53+u1cYhbCXGKSllzpbXpnLsxDLtu73O+Y4e+qQtlHKt5L4byKeh8rsVz2dgO27b8dA7cjsdzVHT73bbvC2eIS/1jY/gPk9h8g9/BjfZ9oaSa1YE5PwtyTRM+bFcpMXEXKKbF4A/BZYB7xYwbMzKaV2L4FeCMDJwr5TBXiHTcslyd772Y64yQedBSpK840kVl5HC2vPJ3MKcf5rHbOuSFVOgtqgZndmnjNqOjpJT7QjrWP315iy+WwXc+S27GL/Pbd5HfsCknw9l3Yvueqc5DmTEhcJyWS2Enx8eQ2iAltcl1P0lvl2lelUtCcCjFVdc/jl3V3h+/G9p3kt+0kt21nz3ek5D+LnV3kH3+a/ONP912fToXa5kTi3NPr3NpS+x9mjCsn4/oc8Boz21LmPq8E9hHq34pkfRNb9ndPhqT4+juw3c8W3Sb94hfQct5pNJ+1ktTUyaMcoXNujEvOgrqe3mR30FlQR5sdPDRue4nzzx3s6Q3OJ3uDn9lTWZ3vpDbSC+aEnsG5M9HkSWhyKyR7dAs9vt5jOKYpkyG9ZAHpJQv6rLd8Htv9LLltu8hvC8lzIYm2g+3Fd5bL9ybX9/ZN4TRzWk9tcypR76xpUxrmDPWAMxDJKd+zOfJ79qFn9tB0zBE1GTGlnN+kHcNIjgEWm9m5lQY0HuV37aXzutvovOYW8o8Wn8QjtWg+zeeupuUVp5FeOHeUI3TOjRcjmAV1VOW27Qynwsco6+4m/8yeRCK8u2e5ZMIymHSa1LxZIQmePzveh6RYUyY1TNLi6kOpFJo7i9TcWXDsUT3rzQwr/EO2LdHrvG0ntmdfyf3Z3v3k9u4nt6XfHAptrSFpLpRpzJ8dykD6lLMkl7Ml1peznC2S/PYul3smaeav/jfUv1dZOQnyOknfB66g78QfpS66u13SS81sUzUCHKusvYPOm+6h6+pbQl1xkQ9a0ybTfNZKWl55Oumjn+8NoHOuaszsS5JeQhh5qDWxvtQkT66f3gvkenuCc4WSiN3PVlQKoulTQ/LRkwDPJj1/DpozIwxd5twwSAoX702bAkct6/OcdXSGsxc9pRqx53nHIGcy2jvI/f7JkoMENKRstm4J8jTgEHBOYt1go1KsAd4l6VFCQl2oWT52JIGOBZbLk93wIJ2/uImuWzcUv7Ai00Rm1fG0vPJlZE55qZ8Oc87VhKRPAmcQEuRfAucBt1J6FtQJy/L5UBu8dTv5p3aQe/qZ3gvkKhlKrjnT2wu8YE4oj5gfeobV1jr0652rArW2kD78MNKHH0ayutyyOfK79iZKNXb19DoXvR6qXqTE+NjpActqaYa2Vsxqc9FEOaNYDHdUivMqjGXMyj7yeKgr/tUd2N79RbdpeulRNJ93Gs1nnuKTeDjnRsObgOOAe83s3ZLmA9+uc0x1ZwcOkXtqB/mtO+L9dnJPPTP8kSIkNHtGIgHuLYvwYbdcI1NTmnT83rL8RT3rzQzb91yiVGMXtnsvpIpM3lJ0uamMbYotNxVfP0RdcWrmNFL1mGpa0kfM7HOSvkSRcb3N7MJ+20+Lsy1V6VLcxpbfuYfOa2+l85pbB145GqUWL6D53DW0nLuG9Pw5oxyhc26CazezvKSspGnAM8CSegc1WiybJb9tV+gR3rqd3NYd5J/aUbITo6TkBXILZvfUBafmzfIZz9y4IgnNmEZqxjR40RH1DqfuButBLlyYt67MffWfvSn573NZszc1OjvUQeeNd9N19c1k73uoeF3x9Ck0n72Slle+jPRRy7wXwTlXL+skzQD+h9AuHwDuqG9I1VeoE85tLfQGh/v89l3DughQUyeTWjyf9OIFpA6b11sn7CMJOTchlUyQzezn8f6b5exopLM3NSrL5uhe/wBdv7iZrtvvLVFXnCFz6vG0vOplZE56aZgL3jnn6sjMPhAXvyrpGmCamd1fz5hGyjo6e8sjYo9wbut2ONRR/k6amkgdNjckwovnk140n9TiBaSmT6ld4M65MWewEoufDfZCM3vtIK+dCRxJ3yunb64kwHrJ79lH++U/D3XFxYZKkUJd8StPp+WMk9Bkryt2ztWfpKPN7DeSTijy3AlmtqEecQ2H5fPkn9ndmwjHEgnbtXdY+9GcGSERXjSf9OL5pBbNDxfK+WgRzrkhDFZisQp4EvgucBdlXiQo6c+Ai4DFwEZgJeG03lmVBChpCeGq6/mEUo1LzewSSZ8C3gfsjJtWdyrUVIrOH68dMBRKaulCWs5dQ/M5a0jPr11xuHPOVeivgfOB/1vkOaPCtrhW8vsPhJ7gJxMlEk8/M7zJQ9paQwKc6BFOL5rnI0a4sUEat7NHjmWDJcgLgJcDbwX+BPgF8F0ze3CIfV4EnATcaWZnSjoa+JcRxJgFPmxmGyRNBdZLWhuf+3cz+/wI9l1SasZUMquOo/vWDWjGVJrPXhXGKz7ycK8rds41LDM7P96fWe9YiunesJnu2++le9PD5LfuwPYfKP/FqVSoC15c6BFeQHrxfDRrurfLrrHEIcpKjvQQ15FOIwnr7MI6OrGOTmjvxIY7qoqrusFqkHPANcA1kloIifKNkj5tZoNNV9phZh2SkNQST/W9sNIAzWwbsC0uPydpC7Co0v0NR9ufvpaWPzybzIkv8bpi59yYIul+whnAH5jZ74bafrR0b9hMx/evHnI7TZ/amwgvDolwasFclPGx410dpVN9hyWLSW7f5SaUHt7Ux2ppDuP6Tp8KxGmWO3qTZmvvDBNiOADU3FyTyUGSBm1pYmL8KkJyvAz4D+CnQ+xza7xy+gpgraS9wOMjDxUkLQOWE0o+VgN/KekdhJE2PmxmAwrUJJ1PON3I0qVLh3W8phe/YGQBO+dc/bwGeDPwA0l54PuEZPmJegbVdES/drg5Q+qweb0XzRVqhX30iKCpCbU2o9YW1NoMmUzonUyq1en5SvZrBnkDy2N56/OYnsd5rGd9eExiW0tuW7jVkhR6cpvK6+0dDUqlYFIrmtRbJmTZbEiUY8JsHZ3jvzSjORP+eWjOQOG+OTMqn4OsxJsr6VvASwgzMH3PzB4Y9s6llwHTgWvMbETnCyRNAW4C/tnMfhIHvd9FqKn7R2Chmb1nsH2sWLHC1q0rd9Q655yrL0nrzWxFFfZzJPAPwNvMrKqnw4bbruZ27KbzFzeiSW1hOLW5M4ecEGDCSKd7kmFiQuyzrQaW75tgl5+I05NkV6u3t5FYZ1dvstzeiXWN0dKMpibUEpJhCr3pNUqEy21XB/vN+1PgIKGm+MJEkIWpo6f1O+CsIvvYFO+nAHuGCqYUSRngx8DlZvYTQgA7Es//D3BVpft3zrnxSNLhhF7kNwM54CP1jQjS82cz6T1vJPvI48Map3jcSadQS+wVbm0JPcRePlKSUikokcdO5OrzntIMkqUZvT3M1t45YLCBukqne5PflmbUEnuGG/Cf5MFqkIcbbbEJQnp2R4UThShk5pcBW8zsC4n1C2N9MsDrgWH3cDvn3Hgl6S4gA/wQ+CMz+32dQ5q4UqmQDLQ2Q1tr7ylj56oslGa0oUltPeusOxt7mDtiTXNX7UszUqne5Lc5JsLNzWPqeq6q/btawwlCVgNvBzZJ2hjX/R3wVknHE5Lvx4D31+j4zjk3Fr3DzB6qdxATjhR6yAolEq0tsYfPufpQpimcnYh1/WYGidIM6+iEru4Kd67e+uBkj/A4KA2qyU8g6Q3AGkLyeouZXVHpvszsVor3SldvzGPnnBt/npV0GXCYmZ0n6RhglZldVu/AxhO1NENbSyiXaGsZtQuInKuUpJ6yngLL5aGjo2/S3K8EKowckembEI/jMyFVT5AlfQV4AWF4IYA/l/RyM/tgtY/lnHOupG8AXwf+Pj5+mDCShSfIFVJzMyRHlGht8WTYjQtKp2DypD6zAltXN9bVHXqfJ+A/frXoQT4LeJHF4TEkfRMYanIR55xz1TXHzH4g6eMAZpaV1EBX6zS4wkVEsXeY1sa8kMi5WlFzZlz3EA+lFgnyI8BSesc+XhLXOeecGz0HJc0mlLohaSWwr74h1UlhnNtUCtKpMKZtKhV6zdJhOUwAkY7Pj+2hv5xzI1eLBHkqsEXS3YSG+WRgnaSfAZjZa2twTOecc339NfAz4AhJtwFzgTfVN6QRGm6iG9dPtFPDzrmRq0WC/Ika7NM559wwmNmGOFnTCwkXOj9kZhVeql59amqCNJ7oOucaUi0S5J1mtjm5QtIZZnZjDY7lnHMuIY4iVMxRkihMtlRv6WWL6h2Cc86VVIsE+Qdxmup/A1qBzwErgFU1OJZzzrm+XhPv5wGnAjfEx2cCtwMNkSA751wjq8VVCKcQLtK7HbgHeJow2YdzzrkaM7N3m9m7CbPoHWNmbzSzNwIvjuucc84NoRYJcjfQDrQRepAfNbP84C9xzjlXZUvMbFvi8Q5C54Vzzrkh1CJBvoeQIJ8EnEaYEvqHNTiOc8650q6XdK2kd0l6F/AL4Fd1jsk558aEWtQgv9fM1sXlbcDrJL29BsdxzjlXgpn9paTXA6fHVZea2U/rGZNzzo0VVU+QzWydpDXAkWb2dUlzgFurfRznnHODiwmxJ8XOOTdMVS+xkPRJ4KPAx+OqZuDb1T6Oc84555xztVCLGuTXA68FDgKY2dOE2fWcc84555xreLVIkLvMzAjTTCNpcg2O4ZxzzjnnXE3UIkH+gaT/BmZIeh/hqun/qcFxnHPODYOkT9U7BuecGwtqcZHe5yW9HNgPvBD4hJmtrfZxnHPODdv6egfgnHNjQdUSZEmKpRXEhHhAUpzcxjnn3Ogys5/XOwbnnBsLqtmD/GtJPwauNLMnCislNQNrgHcCvwa+Ua0DSjoXuARIA18zs4urtW/nnBuLJH2JeA1IMWZ2YRn78LbVOTehVbMG+VwgB3xX0tOSNkt6FPgt8Fbgi2b2jWodTFIa+E/gPOAYwox9x1Rr/845N0atI5RStAInENrg3wLHE4bdHJS3rc45V8UeZDPrAL4CfEVSBpgDtJvZs9U6Rj8nA4+Y2e8BJH0PeB2wuVoHCu9DoQAADDRJREFUeO1/PsWeg7lq7W7iUb0DGJv8bRuf/ujEqVx41syaH8fMvgkg6S+ANWaWjY+/CtxSxi5q3rau+uwTQ2/knHNluuOjS6u+z1pMNY2ZdROmma6lRcCTicdbgVOqeYC8GTmvmK6cv3fO9cjlR/2QM4FpwJ74eEpcN5Qh21ZJ5wPnAyxdWv0/TM45V281SZAbiTfkzrkJ6mLgXkm/JpyYOB34dDV2bGaXApcCrFixwv8Vds6NO2M5QX4KWJJ4vDiu62MkDfkVH1g0kvgmNv+TWRF/28YvjXLtjJl9XdLV9Pb+ftTMtpfx0rLa1pGoxelQ55yrprGcIN8DHCnpeYTG+y3An1TzAE0prwZ1zo1Nkq43s7OBK4usG0zN21bnnGt0YzZBNrOspL8EriUMRfS/ZvZgncNyzrm6ktQKTALmSJpJ73Wf0wj1xYPyttU558ZwggxgZr8EflnvOJxzroG8H/gQcBhhuLdCgrwf+HI5O/C21Tk30Y3pBNk551xfZnYJcImkC8zsS/WOxznnxqJqThTinHOuziSdJGlBITmW9A5JV0r6D0mz6h2fc86NBTKbONfNS9oJPF7BS+cAu6ocTrV4bJXx2CrjsVWm0tgON7O5w3mBpA3AH5jZHkmnA98DLiDMpPciM3tTBXEMdjxvV0eXx1YZj60yjRwbVBZfWe3qhEqQKyVpnZmtqHccxXhslfHYKuOxVWY0Y5N0n5kdF5f/E9hpZp+Kjzea2fGjEcdQ/POqjMdWGY+tMo0cG9Q2Pi+xcM658SUtqXB9ydnADYnn/LoT55wrgzeWzjk3vnwXuEnSLqAduAVA0guAffUMzDnnxgpPkMtzab0DGITHVhmPrTIeW2VGLTYz+2dJ1wMLgeust44uRahFbhT+eVXGY6uMx1aZRo4Nahif1yA755xzzjmX4DXIzjnnnHPOJXiC7JxzzjnnXIInyAmSlkj6taTNkh6UdFFcP0vSWkm/jfcz6xBbq6S7Jd0XY/t0XP88SXdJekTS9yU1j3ZsiRjTku6VdFUjxSbpMUmbJG2UtC6uq/tnGuOYIelHkn4jaYukVY0Qm6QXxvercNsv6UONEFuM76/i78EDkr4bfz8a5ft2UYzrQUkfiusa4n2rF29bRxRfQ7arMRZvW4cfl7etlcc2qm2rJ8h9ZYEPm9kxwErgg5KOAT4GXG9mRwLXx8ejrRM4K45vejxwrqSVwGeBfzezFwB7gffWIbaCi4AticeNFNuZZnZ8YrzERvhMAS4BrjGzo4HjCO9f3WMzs4fi+3U8cCJwCPhpI8QmaRFwIbDCzF4CpIG30ADfN0kvAd4HnEz4PF+tMHpE3d+3OvO2tXKN3K6Ct63D4m1rxbGNfttqZn4rcQOuBF4OPAQsjOsWAg/VOa5JwAbgFMIMMk1x/Srg2jrFtDh+Oc8CrgLUQLE9Bszpt67unykwHXiUeLFsI8XWL55zgNsaJTZgEfAkMIswEs9VwCsa4fsG/BFwWeLxPwAfaYT3rZFu3raWHU/Dtqvx+N62jixOb1vLj23U21bvQS5B0jJgOXAXMN/MtsWntgPz6xRTWtJG4BlgLfA74Fkzy8ZNthK+4PXwRcKXNR8fz6ZxYjPgOknrJZ0f1zXCZ/o8YCfw9XgK9WuSJjdIbElvIYytCw0Qm5k9BXweeALYRhjbdz2N8X17ADhN0mxJk4BXAktogPetUXjbOiyN3K6Ct60j5W1r+Ua9bfUEuQhJU4AfAx8ys/3J5yz8m1KXsfHMLGfhtMxiwmmGo+sRR3+SXg08Y2br6x1LCWvM7ATgPMKp3dOTT9bxM20CTgD+y8yWAwfpd3qont83gFhr9lrgh/2fq1dsscbsdYQ/gocBk4FzRzuOYsxsC+F05HXANcBGINdvm7p+pvXkbWv5xkC7Ct62Vszb1uGpR9vqCXI/kjKEBvxyM/tJXL1D0sL4/EJCL0PdmNmzwK8JpzpmqHda2cXAU3UIaTXwWkmPAd8jnA68pEFiK/xXjJk9Q6j1OpnG+Ey3AlvN7K74+EeERr0RYis4D9hgZjvi40aI7Q+AR81sp5l1Az8hfAcb5ft2mZmdaGanE+r1HqYx3re68rZ12Bq6XQVvW0fI29ZhGu221RPkBEkCLgO2mNkXEk/9DHhnXH4noX5utGObK2lGXG4j1O9tITTmb6pnbGb2cTNbbGbLCKeMbjCztzVCbJImS5paWCbUfD1AA3ymZrYdeFLSC+Oqs4HNjRBbwlvpPQUIjRHbE8BKSZPi72zhfav79w1A0rx4vxR4A/AdGuN9qxtvW4evkdtV8La1CrxtHaZRb1urWUQ91m/AGkL3/P2E7vuNhDqX2YQLJX4L/AqYVYfYjgXujbE9AHwirn8+cDfwCOFUTUud38MzgKsaJbYYw33x9iDw93F93T/TGMfxwLr4uV4BzGyg2CYDu4HpiXWNEtungd/E34X/B7Q0wvctxnYL4Y/KfcDZjfS+1evmbeuIY2yodjURh7etlcXmbWtlsY1q2+pTTTvnnHPOOZfgJRbOOeecc84leILsnHPOOedcgifIzjnnnHPOJXiC7JxzzjnnXIInyM4555xzziV4guyqQtK/SjpT0h9K+vgwXztX0l1xStDT+j13mqQHJW2MY5QON66/G+5rRkrS7cPc/l2SDks8fkzSnOpHNnySDlRjG+dcZbxt7XNMb1vdqPEE2VXLKcCdwMuAm4f52rOBTWa23Mxu6ffc24B/NbPjzay9griG3YgnZgyqiJmdOsyXvIswradzzvXnbWvkbasbTZ4guxGR9G+S7gdOAu4A/gz4L0mfKLLtMkk3SLpf0vWSlko6Hvgc8Lr+PRmS/gz4Y+AfJV0e1/2tpHviPj6d2PYKSetjj8j5cd3FQFvc7+Xx+A8kXvM3kj4Vl2+U9EVJ64CLYs/Lj+Ox7pG0Om73sri/jbFXZmqRn/NAvD8j7vdHkn4TY1C/bd8ErAAu7/fzXyBpg6RNko6O206W9L+S7o7Hfl2RY58h6SZJV0r6vaSLJb0tvmaTpCNKfRZx/fMk3RG3/ad++y763jvnqs/bVm9bXZ3VYzYUv42vG6EB/xKQAW4bZLufA++My+8BrojL7wK+XOI13wDeFJfPAS4FRPjn7irg9PjcrHjfRpgBaHZ8fCCxr2XAA4nHfwN8Ki7fCHwl8dx3gDVxeSlhitzCz7A6Lk8BmorEfCDenwHsI8xdnyL8kVtTZPsbgRWJx48BF8TlDwBfi8v/AvxpXJ5BmId+cr99nQE8CywkzID0FPDp+NxFwBeH+Cx+BrwjLn8w8bMM9t4f6P8z+c1vfhv5zdvWATF72+q3Ubt5D7KrhhMIUz8eDWwZZLtVhMYRwhSWa4Z5nHPi7V5gQzzekfG5CyXdRzgVuSSxfji+n1j+A+DLkjYSGrZpkqYAtwFfkHQhMMPMskPs824z22pmecL0usvKjOUn8X594jXnAB+LMd0ItBL+wPR3j5ltM7NO4HfAdXH9psS+Sn0Wq4HvJtYXDPbeO+dqw9vW0rxtdTU1onogN7HFU3jfIPwXvwuYFFZrI7DKKqtrG/SQhJq5/+4XxxmERneVmR2SdCOhgesvS9+yov7bHEwsp4CVZtbRb5uLJf0CeCVwm6RXmNlvBom5M7Gco/zfucLrkq8R8EYze6jM1wLkE4/zZR6/2PzzRd9751z1edvqbaurP+9BdhUzs41mdjzhdNQxwA3AK6z0RR+3A2+Jy28D+l80MpRrgffE3gYkLZI0D5gO7I0N+NHAysRruiVl4vIOYJ6k2ZJagFcPcqzrgAsKD+IfLCQdYWabzOyzwD2E//ZH6jlgQL1dEdcS6ucUY1k+gmOW+ixu67c+eexi771zrsq8bfW2dQTHd1XiCbIbEUlzCQ1oHjjazDYPsvkFwLsVLjx5O6Fuq2xmdh3h1NUdkjYBPyI0ftcATZK2ABcTTgUWXArcL+lyM+sGPgPcDawFBuuduBBYES+a2Az8eVz/IUkPxJ+hG7h6OD9DCd8Avqqhh1v6R0It4v2SHoyPK1Xqs7gI+GB8fxcVNh7kvXfO1YC3rd62uvqSWbEef+ecc8455yYm70F2zjnnnHMuwRNk55xzzjnnEjxBds4555xzLsETZOecc8455xI8QXbOOeeccy7BE2TnnHPOOecSPEF2zjnnnHMu4f8DQ6YOkk40/d0AAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 720x216 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import xgboost\n",
    "import numpy as np\n",
    "import shap\n",
    "import time\n",
    "from tqdm import tqdm\n",
    "import matplotlib.pylab as pl\n",
    "from shap import KernelExplainer\n",
    "from shap import SamplingExplainer\n",
    "kernel_shap_std_lst = np.load(\"scratch/kernel_shap_std_lst.npy\")\n",
    "ime_std_lst = np.load(\"scratch/ime_std_lst.npy\")\n",
    "kernel_shap_m_lst = np.load(\"scratch/kernel_shap_m_lst.npy\")\n",
    "ime_m_lst = np.load(\"scratch/ime_m_lst.npy\")\n",
    "\n",
    "tree_shap_times_lst = []\n",
    "sample_times_lst = []\n",
    "N = 1000\n",
    "Ms = [20,30,40,50,60,70,80,90]\n",
    "for i in tqdm(range(0,30)):\n",
    "    tree_shap_times = []\n",
    "    sample_times = []\n",
    "    for M in Ms:\n",
    "\n",
    "        X = np.random.randn(N, M)\n",
    "        y = np.random.randn(N)\n",
    "        model = xgboost.train({\"eta\": 1, \"silent\":1}, xgboost.DMatrix(X, y), 1000)\n",
    "\n",
    "        #print()\n",
    "        e = shap.TreeExplainer(model)\n",
    "        s = time.time()\n",
    "        e.shap_values(X)\n",
    "        tree_shap_times.append((time.time() - s)/1000)\n",
    "\n",
    "        tmp = np.vstack([X for i in range(1 * M)])\n",
    "        s = time.time()\n",
    "        model.predict(xgboost.DMatrix(tmp))\n",
    "        sample_times.append(time.time() - s)\n",
    "    tree_shap_times_lst.append(tree_shap_times)\n",
    "    sample_times_lst.append(sample_times)\n",
    "    \n",
    "kernel_ratio_mean = (np.array(kernel_shap_std_lst) / np.array(kernel_shap_m_lst)).mean(0)\n",
    "kernel_ratio_std = (np.array(kernel_shap_std_lst) / np.array(kernel_shap_m_lst)).std(0)\n",
    "ime_ratio_mean = (np.array(ime_std_lst) / np.array(ime_m_lst)).mean(0)\n",
    "ime_ratio_std = (np.array(ime_std_lst) / np.array(ime_m_lst)).std(0)\n",
    "sample_times_mean = np.array(sample_times_lst).mean(0)\n",
    "sample_times_std = np.array(sample_times_lst).std(0)\n",
    "ts_times_mean = np.array(tree_shap_times_lst).mean(0)\n",
    "ts_times_std = np.array(tree_shap_times_lst).std(0)\n",
    "\n",
    "f = pl.figure(figsize=(10,3))\n",
    "pl.subplot(1, 2, 1)\n",
    "pl.plot(\n",
    "    Ms, sample_times_mean*10000 / (60),\n",
    "    label=\"Model Agnostic Lower Bound\",\n",
    "    color=\"#ED3C5B\", linewidth=3\n",
    ")\n",
    "\n",
    "pl.plot(\n",
    "    Ms, np.array(tree_shap_times_lst).mean(0)*10000 / (60),\n",
    "    label=\"Tree SHAP\", color=\"#3888E1\", linewidth=3\n",
    ")\n",
    "\n",
    "pl.fill_between(Ms,(sample_times_mean-sample_times_std)*10000 / (60), \n",
    "                (sample_times_mean+sample_times_std)*10000 / (60), \n",
    "                facecolor='#ED3C5B', alpha=.2)\n",
    "\n",
    "pl.fill_between(Ms,(ts_times_mean-ts_times_std)*10000 / (60), \n",
    "                (ts_times_mean+ts_times_std)*10000 / (60), \n",
    "                facecolor='#3888E1', alpha=.2)\n",
    "\n",
    "pl.ylabel(\"Minutes of runtime\\n(explaining 10k predictions)\")\n",
    "pl.xlabel(\"# of features in the model\")\n",
    "pl.legend()\n",
    "\n",
    "pl.subplot(1, 2, 2)\n",
    "pl.plot(\n",
    "    Ms, ime_ratio_mean*100, \"--\",\n",
    "    label=\"Sample SHAP\", color=\"#ED3C5B\", linewidth=3\n",
    ")\n",
    "pl.plot(\n",
    "    Ms, kernel_ratio_mean*100,\n",
    "    label=\"Kernel SHAP\",\n",
    "    color=\"#ED3C5B\", linewidth=3\n",
    ")\n",
    "pl.fill_between(Ms,(ime_ratio_mean-ime_ratio_std)*100, \n",
    "                (ime_ratio_mean+ime_ratio_std)*100, \n",
    "                facecolor='#ED3C5B', alpha=.2)\n",
    "\n",
    "pl.fill_between(Ms,(kernel_ratio_mean-kernel_ratio_std)*100, \n",
    "                (kernel_ratio_mean+kernel_ratio_std)*100, \n",
    "                facecolor='#ED3C5B', alpha=.2)\n",
    "\n",
    "pl.plot(\n",
    "    Ms, np.zeros(len(Ms)),\n",
    "    label=\"Tree SHAP\",\n",
    "    color=\"#3888E1\", linewidth=3\n",
    ")\n",
    "pl.ylabel(\"Std. deviation as % of magnitude\")\n",
    "pl.xlabel(\"# of features in the model\")\n",
    "pl.ylim([-.36,6.8])\n",
    "pl.legend(loc=\"upper right\")\n",
    "pl.tight_layout()\n",
    "pl.savefig(\"perf.pdf\")\n",
    "pl.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
